package com.lixinlei.miaosha.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

/**
 * 当 Spring 容器中没有 TomcatEmbeddedServletContainerFactory 这个 Bean 时（默认没有），会把此 Bean 加载进 Spring 容器；
 * 对于 spring-configuration-metadata.json 中没有开放给我们的 Tomcat 的参数，可以用这种方式配置；
 * spring-configuration-metadata.json 开放给我们的配置项，都是可以在 application.properties 中配置的；
 * 这种方式是直接操作 Tomcat 中的类；
 * 通过 xml 文件配置的属性，最终也是解析进 Tomcat 的类中的，所以这里直接操作 Tomcat 的类，完成对 Tomcat 的配置；
 */
@Component
public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {

    /**
     *
     * @param factory application.properties 中关于 Tomcat 的配置会传入该接口的实现类中
     */
    @Override
    public void customize(ConfigurableWebServerFactory factory) {
        // 通过 ConfigurableWebServerFactory 接口定制化 Tomcat Connector
        ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();
                // 30s 内没有请求，服务端断开 keepalive 连接
                protocol.setKeepAliveTimeout(30000);
                // 但一个 keepalive 连接中已经收发了 10000 个请求，断开这个 keepalive 连接
                protocol.setMaxKeepAliveRequests(10000);
            }
        });
    }

}
